LAN上のTP-Linkスマートプラグを操作できるライブラリtplink-smarthome-apiを使ってみた
TP-Linkから販売されているスマートプラグをはじめとするIoT製品を操作できるtplink-smarthome-apiというオープンソースのNode.js用ライブラリを使うと、TP-Linkデバイスが設置してあるLAN上でラズパイ等からデバイスを直接操作できます。本記事では、このtplink-smarthome-apiを使用してTP-Linkスマートプラグを操作する手順をご紹介します。
(The English version is available here.)
準備
tplink-smarthome-apiの実行環境には、 ラズパイ3B+を使用しました。制御対象のTP-Linkデバイスには、スマートプラグのHS105を使用しました。
動作確認環境は以下のとおりです:
- ハードウェア: Raspberry Pi 3B+
- OS: Raspbian Buster
- tplink-smarthome-api: 3.1.0
- node: v10.21.0
- HS105
- hardware version: 2.0
- F/W version: 1.0.7
スマートプラグに付属するマニュアルを参照して、プラグ自体を利用可能な状態にセットアップします。山本さんのブログに手順がわかりやすく書いてあります。
tplink-smarthome-apiはnpm
コマンドでインストールします。
npm install tplink-smarthome-api
tplink-smarthome-apiでスマートプラグをON/OFFする
tplink-smarthome-apiでスマートプラグをON/OFFするコードを説明します。動作確認はNodeのREPL上で簡単に行えます。まずtplink-smarthome-apiのNPMモジュールを読み込み、Client
クラスのインスタンスを取得します。
> client = new (require('tplink-smarthome-api').Client)();
plugName
に制御対象デバイスの登録名を指定します。登録名とはKasaアプリにプラグを登録する時につけた名前のことです。
> plugName = 'smartplug001';
ClientクラスのstartDiscovery
メソッドを実行し、LAN上で操作可能な状態になっているプラグの探索を開始します。デバイスが見つかった時に実行されるコールバックの引数に見つかったデバイスを操作するためのデバイスオブジェクトがセットされます。デバイスオブジェクトのgetSysInfo
メソッドで取得したデバイス情報のalias
に登録名がセットされています。client.startDiscovery()
はclient.stopDiscovery()
が実行されるまでデバイスの探索を継続するので、見つけたいデバイスがすべて見つかったらstopDiscovery
を実行してデバイスの探索を終了します。
> plug = undefined; > client.startDiscovery().on('device-online', async (device) => { info = await device.getSysInfo(); plug = device; if (info.alias === plugName) { console.log('stopping device discovery...'); client.stopDiscovery(); } })
スマートプラグをON/OFFするには、見つかったスマートプラグのデバイスオブジェクトのsetPowerState
メソッドを実行します。
> plug.setPowerState(false) # power off > plug.setPowerState(true) # poser on
以下はラズパイ上でtplink-smarthome-apiを使ってLAN上のスマートプラグのON/OFFをしてみた結果の動画です。NodeのREPL上でsetPowerState()
メソッドを実行することで、プラグ実機がOn/Offされています。Kasaアプリ上のデバイスのOn/Off状態もきちんと追従しています。
まとめ
LAN上のTP-Linkのスマートプラグをtplink-smarthome-apiで操作してみました。TP-Linkデバイスは、 純正のKasaアプリまたはIFTTTを利用することで、TP-Linkのサーバーを介してインターネット越しに遠隔操作できますので、通常はtplink-smarthome-apiの出番は無いかもしれません。もし自宅サーバ等が設置されている環境があって、ホームオートメーションで凝ったことをしたいような場合には、このtplink-smarthome-apiが役立つこともあるでしょう。
補足
npmコマンド実行時エラーになった時の対処法
ラズパイ上でnpm search tplink-smarthome-api
を実行した時に、以下のようなエラーが発生しました。
$ npm search tplink-smarthome-api npm WARN npm npm does not support Node.js v10.21.0 npm WARN npm You should probably upgrade to a newer version of node as we npm WARN npm can't make any promises that npm will work with this version. npm WARN npm Supported releases of Node.js are the latest release of 4, 6, 7, 8, 9. npm WARN npm You can find the latest version at https://nodejs.org/ NAME | DESCRIPTION | AUTHOR | DATE | VERSION | KEYWORDS tplink-smarthome-api | TP-Link Smart Home… | =plasticrake | 2020-10-13 | 3.1.0 | tplink kasa hs100 hs10
こちらの記事を参考にして、npmディレクトリのオーナーを自分のアカウントに変更することでエラー解消できました。
$ sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
参照
- HS105 | Wi-Fi スマートプラグ 遠隔操作 直差しコンセント Echo シリーズ Google Home 対応 音声コントロール コンパクト ハブ不要 3年保証 | TP-Link 日本
- TP-Link cloud APIを使ってみる - Tomachi Site
- plasticrake/tplink-smarthome-api: TP-Link Smarthome WiFi API
- tplink-smarthome-api - npm
- TP-Link のスマートプラグ HS105 を買って制御してみた | tech - 氾濫原
- Qaplaの覚書・メモ・備忘録・独言 スマートコンセント(TP-Link HS105)をRaspberry PIから操作
- ガジェット – LM Labo
- TPLinkKasaClient (TP-Link KL130/HS105 APIクライアント実装 - Electronics - 総武ソフトウェア推進所
- スマートコンセント(HS105)を使って電気毛布を自動ON/OFF制御する SleepTech - Qiita
- npmでpermission deniedになった時の対処法[mac] - Qiita